#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_wpa2.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "esp_smartconfig.h"
#include "includes.h"
#include "protocol_common.h"

#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>

static const char *TAG = "app_main";

/*
开机读取wifi配网参数，如果有则直接连接
如果没有，则启动智能配网，等待配网成功
配网成功后重启
socket使用了protocol里的函数，并改写为可以根据传递的wifi配置参数连接wifi
*/

void app_main(void)
{
    wifi_config_t sta_config; //定义一个wifi的sta模式配置参数变量

    esp_err_t ret = nvs_flash_init();   //初始化非易失性nvs存储
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    esp_err_t err = readWifiConfig(&sta_config); //从nvs中读取参数

    Smartconfig_Button_Init(); //智能配网按键初始化

    //如果没找到wifi配网参数，则初始化wifi开始配网
    if (err == ESP_ERR_NVS_NOT_FOUND)
    {
        //初始化wifi，启动智能配网任务
        //在此过程中已经执行了esp_netif_init()和esp_event_loop_create_default()
        //最后配网成功了，则执行系统软重启esp_restart()
        initialise_wifi();
    }
    //如果找到了，打印出来看看
    else if (err == ESP_OK)
    {
        ESP_LOGI(TAG, "readWifiConfig ESP_OK");
        ESP_LOGI(TAG, "SSID:%s", sta_config.sta.ssid);
        ESP_LOGI(TAG, "PASSWORD:%s", sta_config.sta.password);
        if (sta_config.sta.bssid_set == true)
            ESP_LOGI(TAG, "bssid:true");
        else
            ESP_LOGI(TAG, "bssid:false");

        ESP_ERROR_CHECK(esp_netif_init());                //初始化底层TCP/IP堆栈
        ESP_ERROR_CHECK(esp_event_loop_create_default()); //创建默认的事件循环，能够默认处理wifi、以太网、ip等事件

        //注意去读example_connect的代码，里边有启动时wifi的一些配置，比如连接的wifi、用户名密码之类的
        //这些配置在工程配置里有选项，比如选择wifi还是以太网之类的
        ESP_ERROR_CHECK(example_connect(sta_config));
        //Freertos创建任务
        xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);
    }
}
